package com.itany.corejava.code07_面向对象;

/**
 * @author 石小俊
 * @date 2023年04月17日 15:43
 */
public class Test04_static关键字 {
    public static void main(String[] args) {
        SomeClass.name = "admin";
        System.out.println(SomeClass.name);
        // 只有静态变量可以通过类名.变量名访问
        // System.out.println(SomeClass.age);

        SomeClass sc = new SomeClass();
        sc.name = "jack";
        sc.age = 18;
        System.out.println(sc.name);
        System.out.println(sc.age);

        SomeClass sc2 = new SomeClass();
        sc2.name = "tom";
        sc2.age = 20;
        System.out.println(sc2.name);
        System.out.println(sc2.age);

        System.out.println("**********************");
        // 此时的name的值为tom
        // 所有对象共有拥有同一个静态变量
        // 当有对象对静态变量进行了赋值操作之后
        // 会覆盖之前赋的值,因此,此时打印的sc.name相当于sc2.name也相当于SomeClass.name
        System.out.println(sc.name);
        // 建议使用类名.变量名进行访问
        System.out.println(SomeClass.name);
        System.out.println(sc.age);


        System.out.println("************************");
        // 实例方法必须通过对象来调用
        sc.show();
        // 静态方法可以通过对象来调用
        sc.print();
        // 也可以通过类来调用
        // 建议使用类.方法的方式进行调用
        SomeClass.print();
    }
}

class SomeClass {
    // 全局变量可以是实例变量,也可以是静态变量
    // 静态变量,类变量
    static String name;
    // 实例变量
    int age;

    public void show() {
        // 实例方法可以访问实例变量与静态变量
        System.out.println("姓名:" + name + ",年龄:" + age);
        // 实例方法可以访问实例方法与静态方法
        show2();
        print2();
    }

    public void show2() {
        System.out.println("这是实例方法");
    }

    public static void print() {
        // 静态方法只能访问静态变量
        System.out.println("姓名:" + name);
        // 无法访问实例变量,报错
        // System.out.println("年龄:" + age);
        // 静态方法不能方法实例方法
        // show2(); // 报错
        // 静态方法可以访问静态方法
        print2();
    }

    public static void print2() {
        System.out.println("这是静态方法");
    }
}
